package com.tentcoo.core.command;

import com.tentcoo.util.ReflectionUtils;

/**
 * 
 * 
 * @author Allenz
 * @since 0.0.1-SNAPSHOT
 * 
 * @param <T>
 *            命令泛型
 * @param <R>
 *            命令返回值泛型
 */
public abstract class CommandHandler<T extends Command<R>, R> {

	/**
	 * 命令执行方法，由派生类实现。
	 * 
	 * @param command
	 *            命令
	 * @return 符合命令返回值泛型的命令执行结果
	 */
	public abstract R execute(T command);

	/**
	 * 获取派生类的命令泛型类型。
	 * 
	 * @return 命令泛型类型
	 */
	@SuppressWarnings("unchecked")
	public Class<T> getCommandClass() {
		return ReflectionUtils.getSuperClassGenericType(this.getClass(), 0);
	}

	/**
	 * 获取派生类的命令返回值泛型类型。
	 * 
	 * @return 命令返回值泛型类型
	 */
	@SuppressWarnings("unchecked")
	public Class<R> getResultClass() {
		return ReflectionUtils.getSuperClassGenericType(this.getClass(), 1);
	}
}
